import BaseManage from "../manage/baseManage.js";
import EventProduct from "../event/eventProduct.js";

/**
 * @description 商品列表模型
 * @class {ProductListModel}
 * @extends {BaseManage} 商品列表管理器器
 * @author hhx
 * @date 2024-11-26 14:11
 * @version 0.1.2
 */
export default class ProductListModel extends BaseManage {

    /**
     * @description 事件生产者
     * @private
     * @type {Map}
     */
    _eventProduct = null;

    /**
     * @description 商品列表
     * @private
     * @type {Array} 商品列表
     */
    _productList = null;

    /**
     * @description 业务数据 下拉单选器 构造方法
     * @public
     * @constructor
     * @param props {object} 配置对象
     */
    constructor(props = {}) {
        super(props)
    }

    /**
     * @description 实例化 商品列表模型
     * @public
     * @static
     * @param props {object} 配置对象
     * @returns {ProductListModel|*} 商品数据
     */
    static instance(props = {}) {
        let instance = new ProductListModel(props);
        instance.init(props);
        return instance;
    }

    //=========================== 内部成员 ===============================

    /**
     * @description 获取 事件集合
     * @property
     * @protected
     * @return {Map} 事件集合
     */
    get eventProduct() {
        return this._eventProduct;
    }

    /**
     * @description 设置 事件集合
     * @property
     * @protected
     * @param eventProduct {Map} 事件集合
     */
    set eventProduct(eventProduct) {
        this._eventProduct = eventProduct;
    }

    /**
     * @description 获取 商品列表
     * @property
     * @protected
     * @return {Array} 商品列表
     */
    get productList() {
        return this._productList;
    }

    /**
     * @description 设置 商品列表
     * @property
     * @protected
     * @param value {Array} 商品列表
     */
    set productList(value) {
        this._productList = value;
    }

    //========================== 成员方法 ==========================

    /**
     * @description 获取商品列表
     * @public
     * @return {Array} 商品列表
     */
    getProductList() {
        return this.productList;
    }

    /**
     * @description 设置商品列表
     * @public
     * @param value {Array} 商品列表
     */
    setProductList(value) {
        this.productList = value;
    }

    /**
     * @description 获取事件集合
     * @public
     * @return {Map} 事件集合
     */
    getEventProduct() {
        return this.eventProduct;
    }

    /**
     * @description 设置事件集合
     * @public
     * @param newValue {Map} 事件集合
     */
    setEventProduct(newValue) {
        this.eventProduct = newValue;
    }

    //=========================== 基础属性 ===============================


    //=========================== 属性方法 ===============================


    //=========================== 接口方法 ===============================


    //=========================== 构建方法 ===============================

    /**
     * @description 重载初始方法
     * @protected
     * @override
     */
    init(props) {

        super.init(props);

        //初始化成员
        this.initProperty()

        //构建事件生产者
        this.buildEventProduct();

    }

    /**
     * @description 成员初始化
     * @protected
     */
    initProperty() {
        this.productList = []
    }

    /**
     * @description 构建 事件生产者
     * @protected
     */
    buildEventProduct() {
        let eventProduct = this.createEventProduct();
        this.setEventProduct(eventProduct);
    }

    //=========================== 创建方法 ===============================

    /**
     * @description 创建 事件生产者
     * @protected
     * @returns {EventProduct} 事件生产者
     */
    createEventProduct() {
        return EventProduct.instance();
    }

    //=========================== 触发事件 ===============================

    /**
     * @description 触发添加商品事件
     * @protected
     * @param target {object} 触发事件对象
     */
    triggerAddProduct(target) {
        this.eventProduct.triggerEvent(target, 'addProduct', this.productList);
    }

    //=========================== 事件订阅 ===============================

    /**
     * @description 事件订阅
     * @public
     * @param callback {Function} 回调函数
     */
    subscriberAddProduct(callback) {
        this.eventProduct.subscriberEvent(this, 'addProduct', callback);
    }


    //=========================== 处理方法 ===============================


    //=========================== 内部方法 ===============================


    //=========================== 控制方法 ===============================

    //=========================== 重载方法 ===============================

    /**
     * @description 重写方法
     * @protected
     * @override
     */
    addProduct(target, product) {

        this.productList.push(product);
        this.triggerAddProduct(target);
    }

    findProduct(id) {
        //
    }

    removeProduct(id) {
        //
    }

    updateProduct(product) {
        //
    }
}



